home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / signature_switch-1.6.1-tb.xpi / chrome / signatureswitch.jar / content / setsignature.js < prev    next >
Text File  |  2008-03-07  |  12KB  |  400 lines

  1. var availableMailinglists;
  2.  
  3. function onLoad()
  4. {
  5.     var item = window.arguments[0];
  6.  
  7.     if (item)
  8.     {
  9.         document.getElementById("path").value = item.path;
  10.         document.getElementById("description").value = item.description;
  11.  
  12.         document.getElementById("shortcut_key").insertItemAt(0, item.shortcut.charAt(0));
  13.         document.getElementById("shortcut_key").selectedIndex = 0;
  14.  
  15.         document.getElementById("shortcut_modifier_accel").checked = (item.shortcut.charAt(1) == "X");
  16.         document.getElementById("shortcut_modifier_alt").checked = (item.shortcut.charAt(2) == "X");
  17.         document.getElementById("shortcut_modifier_control").checked = (item.shortcut.charAt(3) == "X");
  18.         document.getElementById("shortcut_modifier_meta").checked = (item.shortcut.charAt(4) == "X");
  19.         document.getElementById("shortcut_modifier_shift").checked = (item.shortcut.charAt(5) == "X");
  20.  
  21.         fillListboxFromArray(document.getElementById("addresses"), item.addresses.split(";"))
  22.         fillListboxFromArray(document.getElementById("newsgroups"), item.newsgroups.split(";"))
  23.         fillListboxFromArray(document.getElementById("mailinglists"), item.mailinglists.split(";"))
  24.     }
  25.  
  26.     availableMailinglists = obtainMailinglists();
  27.  
  28.     if (availableMailinglists.length < 1)
  29.         document.getElementById("pickMailinglist").disabled;
  30. }
  31.  
  32. function onDialogAccept()
  33. {
  34.     var isValid = false;
  35.  
  36.     try
  37.     {
  38.         isValid = checkDescription() && checkPath();
  39.  
  40.         var item = window.arguments[0];
  41.  
  42.         if (isValid && item)
  43.         {
  44.             item.description = document.getElementById("description").value;
  45.             item.path = document.getElementById("path").value;
  46.  
  47.             var shortcut;
  48.  
  49.             shortcut = document.getElementById("shortcut_key").selectedItem.label;
  50.             shortcut = shortcut + ((document.getElementById("shortcut_modifier_accel").checked) ? "X" : "-");
  51.             shortcut = shortcut + ((document.getElementById("shortcut_modifier_alt").checked) ? "X" : "-");
  52.             shortcut = shortcut + ((document.getElementById("shortcut_modifier_control").checked) ? "X" : "-");
  53.             shortcut = shortcut + ((document.getElementById("shortcut_modifier_meta").checked) ? "X" : "-");
  54.             shortcut = shortcut + ((document.getElementById("shortcut_modifier_shift").checked) ? "X" : "-");
  55.  
  56.             if (item.shortcut != shortcut)
  57.                 alert(getLocalizedMessage("alert.keyBindings"));
  58.  
  59.             item.shortcut = shortcut;
  60.             item.addresses = getArrayFromListbox(document.getElementById("addresses"));
  61.             item.newsgroups = getArrayFromListbox(document.getElementById("newsgroups"));
  62.             item.mailinglists = getArrayFromListbox(document.getElementById("mailinglists"));
  63.         }
  64.     }
  65.     catch (err)
  66.     {
  67.         alert(err);
  68.     }
  69.  
  70.     return isValid;
  71. }
  72.  
  73. function onDialogCancel()
  74. {
  75. }
  76.  
  77. function onPickSignature()
  78. {
  79.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  80.  
  81.     fp.init(window, getLocalizedMessage("setSignature.setSignatureTitle"), Components.interfaces.nsIFilePicker.modeOpen);
  82.     fp.appendFilters(Components.interfaces.nsIFilePicker.filterAll);
  83.  
  84.     var res = fp.show();
  85.  
  86.     if (res == Components.interfaces.nsIFilePicker.returnOK)
  87.         document.getElementById("path").value = fp.file.path;
  88.  
  89.     return true;
  90. }
  91.  
  92. function onComposeSignature()
  93. {
  94.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  95.  
  96.     var composerPath = pref.getComplexValue("extensions.signatureswitch.composerpath", Components.interfaces.nsISupportsString).data;
  97.     var sigPath = replaceDirectoryVariable(document.getElementById("path").value);
  98.  
  99.     var sig = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  100.     sig.initWithPath(sigPath);
  101.  
  102.     var composer = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  103.     composer.initWithPath(composerPath);
  104.  
  105.     if (!composer.exists())
  106.     {
  107.         alert(getLocalizedMessage("options.composerNotFound"));
  108.         return false;
  109.     }
  110.  
  111.     // this one is making trouble on Mac *sigh* ...
  112.     //if (!composer.isExecutable())
  113.     //    return false;
  114.  
  115.     var composerArgs = [sigPath];
  116.  
  117.     if (!sig.exists())
  118.     {
  119.         var params = {inn:{sigPath:sigPath}, out:null};
  120.         window.openDialog("chrome://signatureswitch/content/create.xul", "", "chrome, dialog, modal, resizable=yes", params).focus();
  121.  
  122.         if (!params.out)
  123.            return false;
  124.  
  125.         var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  126.         foStream.init(sig, 0x02 | 0x08 | 0x20, 0666, 0);
  127.         foStream.write("", 0);
  128.         foStream.close();
  129.     }
  130.  
  131.     var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
  132.     process.init(composer);
  133.     process.run(false, composerArgs, composerArgs.length);
  134. }
  135.  
  136. function onPickMailinglist()
  137. {
  138.     var params = {mailinglists:availableMailinglists, selection:null};
  139.  
  140.     window.openDialog("chrome://signatureswitch/content/mailinglist.xul", "", "chrome, dialog, modal, resizable=yes", params).focus();
  141.  
  142.     if (params.selection)
  143.        document.getElementById("mailinglist").value = params.selection;
  144. }
  145.  
  146. function checkDescription()
  147. {
  148.     var description = document.getElementById("description");
  149.     var isValid;
  150.  
  151.     if (description.value == "" || description.value.indexOf("*") > -1 || description.value.indexOf("|") > -1)
  152.         isValid = false;
  153.     else
  154.         isValid = true;
  155.  
  156.     if (!isValid)
  157.     {
  158.         alert(getLocalizedMessage("setSignature.invalidDescription"));
  159.         description.focus();
  160.     }
  161.  
  162.     return isValid;
  163. }
  164.  
  165. function checkPath()
  166. {
  167.     var path = document.getElementById("path");
  168.     var isValid;
  169.  
  170.     if (path.value == "" || path.value.indexOf("*") > -1 || path.value.indexOf("|") > -1)
  171.         isValid = false;
  172.     else
  173.         isValid = true;
  174.  
  175.     if (!isValid)
  176.     {
  177.         alert(getLocalizedMessage("setSignature.invalidPath"));
  178.         path.focus();
  179.     }
  180.  
  181.     return isValid;
  182. }
  183.  
  184. function replaceDirectoryVariable(path)
  185. {
  186.     if (path.substring(0,1) != "%")
  187.          return path;
  188.  
  189.     var returnPath = path;
  190.  
  191.     try
  192.     {
  193.         var dirVar = path.substring(1, path.indexOf("%", 1));
  194.         returnPath = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get(dirVar, Components.interfaces.nsIFile).path + path.substring(path.indexOf("%", 1) + 1);
  195.     }
  196.     catch (e) {}
  197.  
  198.     return returnPath;
  199. }
  200.  
  201. function fillListboxFromArray(listbox, array)
  202. {
  203.     for (var i = 0; i < array.length; i++)
  204.     {
  205.         if (array[i] != "-")
  206.             listbox.appendItem(array[i], array[i]);
  207.     }
  208. }
  209.  
  210. function getArrayFromListbox(listbox)
  211. {
  212.     var array = new Array();
  213.  
  214.     if (listbox.getRowCount() > 0)
  215.     {
  216.         for (var i = 0; i < listbox.getRowCount(); i++)
  217.         {
  218.             array.push(listbox.getItemAtIndex(i).value);
  219.         }
  220.  
  221.         array = array.join(";");
  222.     }
  223.     else
  224.     {
  225.        array = "-";
  226.     }
  227.  
  228.     return array;
  229. }
  230.  
  231. function getLocalizedMessage(msg)
  232. {
  233.     return document.getElementById("signatureswitch.locale").getString(msg);
  234. }
  235.  
  236. function addAutoSwitch(type)
  237. {
  238.     var input;
  239.     var listbox;
  240.  
  241.     var msgInvalid;
  242.     var msgDuplicate;
  243.  
  244.     switch (type)
  245.     {
  246.         case "address":
  247.            input = document.getElementById("address");
  248.            listbox = document.getElementById("addresses");
  249.            msgInvalid = getLocalizedMessage("setSignature.invalidAddress");
  250.            msgDuplicate = getLocalizedMessage("setSignature.duplicateAddress");
  251.            break;
  252.         case "newsgroup":
  253.            input = document.getElementById("newsgroup");
  254.            listbox = document.getElementById("newsgroups");
  255.            msgInvalid = getLocalizedMessage("setSignature.invalidNewsgroup");
  256.            msgDuplicate = getLocalizedMessage("setSignature.duplicateNewsgroup");
  257.            break;
  258.         case "mailinglist":
  259.            input = document.getElementById("mailinglist");
  260.            listbox = document.getElementById("mailinglists");
  261.            msgInvalid = getLocalizedMessage("setSignature.invalidMailinglist");
  262.            msgDuplicate = getLocalizedMessage("setSignature.duplicateMailinglist");
  263.            break;
  264.     }
  265.  
  266.     if (!validateAutoswitch(input.value, type))
  267.     {
  268.         alert(msgInvalid);
  269.         return;
  270.     }
  271.  
  272.     for (var i = 0; i < listbox.getRowCount(); i++)
  273.     {
  274.         if (listbox.getItemAtIndex(i).value == input.value)
  275.         {
  276.             alert(msgDuplicate);
  277.             return;
  278.         }
  279.     }
  280.  
  281.     listbox.appendItem(input.value, input.value);
  282.     listbox.ensureIndexIsVisible(listbox.getRowCount()-1);
  283.     input.value = "";
  284. }
  285.  
  286. function removeAutoswitch(type)
  287. {
  288.     var listbox;
  289.     var selected;
  290.  
  291.     switch (type)
  292.     {
  293.         case "address":
  294.            listbox = document.getElementById("addresses");
  295.            break;
  296.         case "newsgroup":
  297.            listbox = document.getElementById("newsgroups");
  298.            break;
  299.         case "mailinglist":
  300.            listbox = document.getElementById("mailinglists");
  301.            break;
  302.     }
  303.  
  304.     selected = listbox.selectedIndex;
  305.  
  306.     if (selected >= 0)
  307.         listbox.removeItemAt(selected);
  308. }
  309.  
  310. function validateAutoswitch(input, type)
  311. {
  312.     if (type == "mailinglist")
  313.         return true; // really don't validate mailinglists?
  314.  
  315.     if (input.indexOf("?") > -1)
  316.     {
  317.         if (input.charAt(0) == "?")
  318.             input = "X" + input;
  319.  
  320.         if ( input.charAt(input.length - 2) == "." &&
  321.              input.charAt(input.length - 1) == "?" )
  322.             input += "X";
  323.  
  324.         input = input.split("?").join("X");
  325.     }
  326.  
  327.     var rx = null;
  328.  
  329.     if (type == "address")
  330.     {
  331.         var rx_user = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
  332.         var rx_domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
  333.  
  334.         rx = "^" + rx_user + "\@" + rx_domain + "$";
  335.     }
  336.     else
  337.     {
  338.         rx = "[a-zA-Z0-9][a-zA-Z0-9_.-]*";
  339.     }
  340.  
  341.     var validate = new RegExp(rx);
  342.  
  343.     return validate.test(input);
  344. }
  345.  
  346. function obtainMailinglists()
  347. {
  348.     var abRdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
  349.     var abRootDir = abRdf.GetResource("moz-abdirectory://").QueryInterface(Components.interfaces.nsIAbDirectory);
  350.     var abSubDirs = abRootDir.childNodes.QueryInterface(Components.interfaces.nsISimpleEnumerator);
  351.  
  352.     var mailLists = new Array();
  353.  
  354.     var abDir;
  355.     var abCardsEnumerator;
  356.     var abCard;
  357.  
  358.     var continueSearch;
  359.  
  360.     while (abSubDirs.hasMoreElements())
  361.     {
  362.         abDir = abSubDirs.getNext().QueryInterface(Components.interfaces.nsIAbDirectory);
  363.         abCardsEnumerator = abDir.childCards;
  364.  
  365.         continueSearch = true;
  366.  
  367.         try
  368.         {
  369.             abCardsEnumerator.first();
  370.         }
  371.         catch (ex)
  372.         {
  373.             continueSearch = false;
  374.         }
  375.  
  376.         while (continueSearch)
  377.         {
  378.             abCard = abCardsEnumerator.currentItem();
  379.             abCard = abCard.QueryInterface(Components.interfaces.nsIAbCard);
  380.  
  381.             if (abCard)
  382.             {
  383.                 if (abCard.isMailList)
  384.                    mailLists.push(abCard.displayName);
  385.             }
  386.  
  387.             try
  388.             {
  389.                 abCardsEnumerator.next();
  390.             }
  391.             catch (ex)
  392.             {
  393.                 continueSearch = false;
  394.             }
  395.         }
  396.     }
  397.  
  398.     return mailLists.reverse();
  399. }
  400.